home *** CD-ROM | disk | FTP | other *** search
- #!/usr/bin/perl
- # handle plugging in usb modules
- #TYPE=0/0/0
- #ACTION=add
- #DEVFS=/proc/bus/usb
- #DEVICE=/proc/bus/usb/001/013
- #INTERFACE=255/0/0
- #PRODUCT=5a9/a511/100
-
- $uname=`uname -r`;chomp($uname);
-
- if (!$ENV{'TYPE'} || !$ENV{'PRODUCT'}) {
- logit("ERROR: Those suckers changed the kernel interface _AGAIN_!\n");
- die;
- }
-
- ($intclass,$intsubclass,$intproto) = split(/\//,$ENV{'TYPE'});
- ($vendor,$product,$revision) = split(/\//,$ENV{'PRODUCT'});
-
- if (!defined($revision) || !defined($intproto)) {
- logit("ERROR: Those suckers changed the kernel interface _AGAIN_!\n");
- die;
- }
-
- $intclass = oct "0x$intclass";
- $intsubclass = oct "0x$intsubclass";
- $intproto = oct "0x$intproto";
- $vendor = oct "0x$vendor";
- $product = oct "0x$product";
- $revision = oct "0x$revision";
-
- logit("interface: $intclass/$intsubclass/$intproto, v: $vendor, p: $product, rev $revision\n");
-
- %loaded = ();
-
- if ($ENV{'ACTION'} eq 'add') {
- if (!open(USBMAP,"/lib/modules/$uname/modules.usbmap")) {
- logit("could not open USBMAP:$!\n");
- exit 0;
- }
- # # module idVendor idProduct bcdDevice_lo bcdDevice_hi bDeviceClass bDeviceSubClass bDeviceProtocol bInterfaceClass bInterfaceSubClass bInterfaceProtocol driver_info
-
- $vars = <USBMAP>;chomp($vars);
- $vars =~ s/^# //;
- $vars =~ s/^usb //;
- @vars = split(/\s+/,$vars);
- for ($i=0;$i<@vars;$i++) { $vi{$vars[$i]} = $i; }
- foreach ('match_flags','idVendor','idProduct','bDeviceClass','bDeviceSubClass','bDeviceProtocol','bInterfaceClass','bInterfaceSubClass','bInterfaceProtocol') {
- logit("ERROR: $_ missing\n") unless (defined($vi{$_}));
- }
- while (<USBMAP>) {
- print STDERR;
- chomp;
- @vals = split;
- $module = $vals[$vi{'module'}];
-
- next if ($loaded{$module});
-
- $match_flags = oct $vals[$vi{'match_flags'}];
- $xvendor = oct $vals[$vi{'idVendor'}];
- $xproduct = oct $vals[$vi{'idProduct'}];
- $bdevclass = oct $vals[$vi{'bDeviceClass'}];
- $bdevsubclass = oct $vals[$vi{'bDeviceSubClass'}];
- $bdevproto = oct $vals[$vi{'bDeviceProtocol'}];
- $bintclass = oct $vals[$vi{'bInterfaceClass'}];
- $bintsubclass = oct $vals[$vi{'bInterfaceSubClass'}];
- $bintproto = oct $vals[$vi{'bInterfaceProtocol'}];
-
- if ($xvendor) {
- if (($xvendor==$vendor) && ($xproduct==$product)) {
- logit("loading module $module");
- system("/sbin/modprobe -k $module");
- $loaded{$module} = 1;
- }
- } else {
- if (($bdevclass == $intclass) &&
- (!$bdevsubclass || ($intsubclass==$bdevsubclass)) &&
- (!$bdevproto || ($intproto == $bdevproto))
- ) {
- logit("loading module $module");
- system("/sbin/modprobe -k $module");
- $loaded{$module} = 1;
- }
-
- if (($bintclass == $intclass) &&
- (!$bintsubclass || ($intsubclass==$bintsubclass)) &&
- (!$bintproto || ($intproto == $bintproto))
- ) {
- logit("loading module $module");
- system("/sbin/modprobe -k $module");
- $loaded{$module} = 1;
- }
- }
- }
- close(USBMAP);
- }
-
- system("/opt/redmondlinux/bin/rlhwrescan");
-
- exit 0;
-
- sub logit {
- my($logline) = @_;
-
- # is not writeable on bootup
- open(VARLOG,">>/var/log/hotplug")||return;
- print VARLOG $logline . "\n";
- close(VARLOG);
- }
-